package com.tanhua.dubbo.api.mongo;

import com.tanhua.domain.mongo.Comment;
import com.tanhua.domain.mongo.Publish;
import com.tanhua.domain.mongo.RecommendUser;
import com.tanhua.domain.vo.PageResult;
import org.apache.dubbo.config.annotation.Service;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import java.util.List;

/**
 * 评论服务接口实现类
 */
@Service
public class CommentApiImpl implements CommentApi{

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 动态点赞
     * 动态喜欢
     * @param comment
     * @return
     */
    @Override
    public int like(Comment comment) {
        //1保存动态点赞记录
        comment.setId(ObjectId.get());//主键id
        comment.setCreated(System.currentTimeMillis());//动态点赞时间
        //1.1 设置被评论的用户id(针对动态操作)
        if(comment.getPubType() == 1) {
            ObjectId publishId = comment.getPublishId();//动态发布id 主键
            Publish publish = mongoTemplate.findById(publishId, Publish.class);
            comment.setPublishUserId(publish.getUserId());//被评论的用户id
        }
        mongoTemplate.insert(comment);
        //2根据发布id更新发布表点赞数量+1
        updateCount(comment,1);
        //3根据发布id查询发布表点赞数量
        return getCount(comment);
    }

    /**
     * 针对动态操作 -- 2根据发布id更新发布表点赞 喜欢 数量+1 -1
     *
     * 针对评论操作
     * @param comment
     * @param num
     */
    private void updateCount(Comment comment, int num) {
        //1.构造更新数据的条件
        Query query = new Query();
        query.addCriteria(Criteria.where("id").is(comment.getPublishId()));//根据发布表的主键id 更新发布表的点赞 喜欢数数量
        //2.构造要更新的数据
        Update update = new Update();
        update.inc(comment.getCol(),num);//根据评论类型，1-点赞，2-评论，3-喜欢 返回需要操作的发布表的字段名称 进行数量+1 -1
        //3.调用api更新点赞数数量+1 -1
        Class<?> clazz = Publish.class;//默认操作动态发布表
        if(comment.getPubType() == 3){//评论内容类型： 1-对动态操作 2-对视频操作 3-对评论操作
            //如果是评论表操作 设置评论对象
            clazz = Comment.class;
        }
        mongoTemplate.updateFirst(query,update,clazz);
    }

    /**
     * 针对动态操作 --  3根据发布id查询发布表点赞 喜欢 数量
     * @param comment
     * @return
     */
    private int getCount(Comment comment) {
        if(comment.getPubType() == 1) {//评论内容类型： 1-对动态操作 2-对视频操作 3-对评论操作
            Publish publish = mongoTemplate.findById(comment.getPublishId(), Publish.class);
            if (comment.getCommentType() == 1) {  //评论类型，1-点赞，2-评论，3-喜欢
                return publish.getLikeCount();
            }
            if (comment.getCommentType() == 2) {  //评论类型，1-点赞，2-评论，3-喜欢
                return publish.getCommentCount();
            }
            if (comment.getCommentType() == 3) {  //评论类型，1-点赞，2-评论，3-喜欢
                return publish.getLoveCount();
            }
        }
        if(comment.getPubType() == 3){
            Comment cm = mongoTemplate.findById(comment.getPublishId(), Comment.class);
            return cm.getLikeCount();//评论点赞数
        }
        return 0;
    }

    /**
     * 动态取消点赞
     * 动态取消喜欢
     * @param comment
     * @return
     */
    @Override
    public int dislike(Comment comment) {
        //1删除动态点赞记录
        Query query = new Query();
        query.addCriteria(
                Criteria.where("publishId").is(comment.getPublishId())
                        .and("commentType").is(comment.getCommentType())
                        .and("pubType").is(comment.getPubType())
                        .and("userId").is(comment.getUserId()));
        mongoTemplate.remove(query,Comment.class);
        //2根据发布id更新发布表点赞数量-1
        updateCount(comment,-1);
        //3根据发布id查询发布表点赞数量
        return getCount(comment);
    }

    /**
     * 评论列表分页查询
     * movementId:动态id
     */
    @Override
    public PageResult<Comment> findPageCommentById(int page, int pagesize, String publishId) {
        //1.查询总记录数  publishId动态id+ commentType=2 + pubType=1
        Query query = new Query();
        query.addCriteria(
                Criteria.where("publishId").is(new ObjectId(publishId)) //动态id
                .and("commentType").is(2) //评论类型，1-点赞，2-评论，3-喜欢
                .and("pubType").is(1) //评论内容类型： 1-对动态操作 2-对视频操作 3-对评论操作
        );
        long counts = mongoTemplate.count(query, Comment.class);
        //2.查询当前页面需要展示的数据
        query.limit(pagesize).skip((page-1)*pagesize);
        //根据缘分值排序 将缘分值最高的放前面展示
        query.with(Sort.by(Sort.Direction.DESC,"created"));
        List<Comment> commentList = mongoTemplate.find(query, Comment.class);
        //3.封装数据返回
        Long pages = counts/pagesize + (counts%pagesize > 0 ? 1:0);
        return new PageResult<>(counts,(long)pagesize,pages,(long)page,commentList);
    }
    /**
     * 根据发布动态用户id 和 评论类型 分页查询动态评论表
     * @param userId 根据发布动态用户id
     * @param type  评论类型，1-点赞，2-评论，3-喜欢
     * @param page 1
     * @param pagesize 10
     * @return
     */
    @Override
    public PageResult<Comment> findPageByType(Long userId, int type, int page, int pagesize) {
        //1.查询总记录数
        Query query = new Query();
        query.addCriteria(Criteria.where("publishUserId").is(userId).and("commentType").is(type));
        long counts = mongoTemplate.count(query, Comment.class);
        //2.查询当前页面需要展示的数据
        query.limit(pagesize).skip((page-1)*pagesize);
        query.with(Sort.by(Sort.Direction.DESC,"created"));
        List<Comment> commentList = mongoTemplate.find(query, Comment.class);
        //3.封装数据返回
        Long pages = counts/pagesize + (counts%pagesize > 0 ? 1:0);
        return new PageResult<>(counts,(long)pagesize,pages,(long)page,commentList);
    }
}
